<?php
defined('YF_PATH') or exit();
/**
 * 系统数据模型基类
 *
 * @author yifa
 */
class Model {
        // 当前数据库操作对象
        protected $db = null;
        // 数据表前缀
        protected $tablePrefix  =   '';
        // 模型名称
        protected $name = '';
        // 数据库名称
        protected $dbName  = '';
        // 数据表名（不包含表前缀）
        protected $tableName = '';
        // 实际数据表名（包含表前缀）
        protected $trueTableName ='';
        // 最近错误信息
        protected $error = '';
        //查询条件
        protected $where = '';
        //查询记录数
        protected $total = '';
        //分页
        protected $pages = '';

        /**
        +----------------------------------------------------------
        * 架构函数
        * 取得DB类的实例对象
        +----------------------------------------------------------
        * @param string $name 模型名称
        +----------------------------------------------------------
        * @access public
        +----------------------------------------------------------
        */
        function __construct($name='', $dbConfigName = 'DEFAULT') {
                //获取模型名称
                if(!empty($name)){
                        $this->name = $name;
                }else{
                        $this->name = $this->getModelName();
                }
                $dbAllConfig = getConfig('DATABASE');
                $dbCnfig = $dbAllConfig[$dbConfigName];
                F::loadFile(CORE_PATH.'Db/'.$dbCnfig['DB_TYPE'].'Db.class.php');
                $this->db = Db::getInstance(array(), $dbConfigName);
                $this->tablePrefix = $this->tablePrefix ? $this->tablePrefix : $dbCnfig['DB_PREFIX'];
                $this->trueTableName = $this->trueTableName ? $this->trueTableName : $this->tablePrefix.$this->name;
                $this->db->setTableName($this->trueTableName);
        }
        
        /**
         * 初始化
         */
        function init(){
                //加载相应的
        }
        
        /**
         * SQL 执行
         */
        function query($sql){
                return $this->db->query($sql);
        }
        
        /**
         * 基础查询函数
         * @param array $whereDate 条件的参数值 $key 必须和$whereSql相同顺序的:user相同
         * @param str $whereSql 条件的sql字符串,格式 user = :user
         * @param str $limit 分页
         * @param str $orderby 排序方式
         * @param str $data 返回的字段
         * @param str $groupby 分组方式
         */
        function select($whereDate = array(), $whereSql = '1=1', $orderby = '', $data = '*', $groupby = ''){
            $orderby = $orderby ? ' ORDER BY '.$orderby :'';    
            $groupby = $groupby ? ' GROUP BY '.$groupby :'';    
            return $this->db->select($whereDate, $whereSql, $groupby, $orderby, $data, $groupby);
        }
        
        /**
         * 基础查询函数
         * @param array $whereDate 条件的参数值 $key 必须和$whereSql相同顺序的:user相同
         * @param str $whereSql 条件的sql字符串,格式 user = :user
         * @param str $orderby 排序方式
         * @param int $page 页码
         * @param int $pageSize 每页显示条数
         * @param str $data 返回的字段
         * @param str $groupby 分组方式
         */
        function listInfo($whereDate = array(), $whereSql = '1=1', $page = 1, $pageSize = 20, $orderby = '', $data = '*', $groupby = ''){
                return $this->db->select($whereDate, $whereSql, $orderby, $data, $groupby, $page, $pageSize);
        }
        
        /**
         * 取得单条查询记录
         * @param array $whereDate 条件的参数值 $key 必须和$whereSql相同顺序的:user相同
         * @param str $whereSql 条件的sql字符串,格式 user = :user
         * @param str $orderby 排序方式
         * @param str $data 返回的字段
         * @param str $groupby 分组方式
         */
        function getOne($whereDate = array(), $whereSql = '1=1', $data = '*', $orderby = '', $groupby = ''){
                $queryData = $this->db->count($whereDate, $whereSql, $groupby);
                return $queryData;
        }
        
        /**
         * 取得单条查询记录
         * @param array $whereDate 条件的参数值 $key 必须和$whereSql相同顺序的:user相同
         * @param str $whereSql 条件的sql字符串,格式 user = :user
         * @param str $orderby 排序方式
         * @param str $data 返回的字段
         * @param str $groupby 分组方式
         */
        function getValue($whereDate = array(), $whereSql = '1=1', $data = '*', $orderby = '', $groupby = ''){
                $queryData = $this->getOne($whereDate, $whereSql, $data, $orderby, $groupby);
                return $queryData;
        }
        
        /**
         * 符合的记录总数
         */
        function count($whereDate = array(), $whereSql = '1=1', $groupby = ''){
                return $this->getValue($whereDate, $whereSql, 'COUNT(1) AS num');
        }
        
        
        /**
         * 保存数据
         * @param array $data 保存的数据,key为字段,value为值
         */
        function insert($data){
            return $this->db->insert($data);
//                $fields = '';
//                $values = '';
//                $val = array();
//                foreach ($data as $key=>$v){
//                        if($key){
//                                if($fields){
//                                        $fields .= ',`'.$key.'`';
//                                        $values .= ',?';
//                                }else{
//                                        $fields .= '`'.$key.'`';
//                                        $values .= '?';
//                                }
//                                $val[] = $v;
//                        }
//                }
//                $sql = 'INSERT INTO '.$this->getTableName().'('.$fields.') VALUES('.$values.')';
//                try{
//                        $stmt = $this->db->prepare($sql);
//                        return $stmt->execute($val);
//                }catch(PDOException $e){
//                        throwException($e, '',$e->getCode());
//                }
        }
        
        /**
         * 更新数据
         * @param array $data 保存的数据,key为字段,value为值
         * @param array $whereDate 条件的参数值 $key 必须和$whereSql相同顺序的:user相同
         * @param str $whereSql 条件的sql字符串,格式 user = :user
         * @return int 影响的行数
         */
        function update($data, $whereDate = array(), $whereSql = ''){
            return $this->db->update($data, $whereDate, $whereSql);
//                $whereSql = $whereSql ? ' WHERE '.$whereSql : '';
//                $dataFields = '';
//                $val = array();
//                foreach ($data as $key=>$v){
//                        if($key){
//                                if($dataFields){
//                                        $dataFields .= ',`'.$key.'` = :u_'.$key;
//                                }else{
//                                        $dataFields .= '`'.$key.'` = :u_'.$key;
//                                }
//                                $val[':u_'.$key] = $v;
//                        }
//                }
//                $val = array_merge($val, $whereDate);
//                
//                $sql = 'UPDATE '.$this->getTableName().' SET '.$dataFields.' '.$whereSql;
//                try {
//                        $stmt = $this->db->prepare($sql);
//                        $stmt->execute($val);
//                        return $stmt->rowCount();
//                }catch(PDOException $e){
//                        throwException($e, '',$e->getCode());
//                }
        }
        
        /**
         * 删除
         * @param array $whereDate 条件的参数值 $key 必须和$whereSql相同顺序的:user相同
         * @param str $whereSql 条件的sql字符串,格式 user = :user
         * @return int 影响的行数
         */
        function delete($whereDate = array(), $whereSql = ''){
            $this->db->delete($whereDate, $whereSql);
//                $whereSql = $whereSql ? ' WHERE '.$whereSql : '';
//                $sql = ' DELETE '.$this->getTableName().'  '.$whereSql;
//                try {
//                        $stmt = $this->db->prepare($sql);
//                        $stmt->execute($whereDate);
//                        return $stmt->rowCount();
//                }catch(PDOException $e){
//                        throwException($e, '',$e->getCode());
//                }
        }
        
        /**
         * 取得插入的ID
         */
        function insertId(){
                return $this->db->insertId();
        }
        
        /**
	 * 获取表字段
	 * @param $table 		数据表
	 * @return array
	 */
	public function get_fields($table) {
                return $this->db->get_fields($table);
	}
        
        /**
         * 设置操作的表,不包含前缀
         */
        function getTableName(){
                if($this->trueTableName){
                        return $this->trueTableName;
                }else{
                        throwException('tanle name not exist');
                }
        }
        
        /**
         * 设置操作的表,不包含前缀
         */
        function setTableName($tableName){
                $this->trueTableName = $this->tablePrefix.$tableName;
        }
        
        /**
         * 开启事务
         */
        function beginTransaction(){
                 $this->db->beginTransaction();
        }
        /**
         * 提交事务
         */
        function commit(){
                $this->db->commit();
        }
        /**
         * 回滚事务
         */
        function rollBack(){
                $this->db->rollBack();
        }


        /**
         * 取得模型名称
         */
        function getModelName(){
                if(empty($this->name)) {
                        $this->name =   substr(get_class($this),0,-5);
                    }
                return $this->name;
        }
        
        /**
         * 析构函数,对象销毁的时候调用
         */
        function __destruct() {
                if($this->db){
                        $this->db = null;
                }
        }
}

?>
